recoil-sync 素振り
❗️ Preview Documentation ❗️
This is preview documentation for the recoil-sync library before it is released.
2022/05/28
refineの実態が見つかりません どこですか
refineは表記通りrecoil-syncの中に入っているものの、型定義が同梱されていない
に定義があるので
code:src/@types/recoil.d.ts
import "recoil-sync"
declare module "recoil-sync" {
export namespace refine {
// Minimum TypeScript Version: 3.7
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @emails oncall+recoil
*/
以下省略
のように置いてやると
code:ts
// zod like
import { syncEffect, refine as $ } from "recoil-sync"
export const nullableNumberAtom = atom<number | null>({
key: "nullablenumber",
default: null,
effects: [
syncEffect({
storeKey: "store-key",
refine: $.nullable($.number()),
}),
],
})
のようにして使える、この場合はstore-keyというキーを持つストアに対してread/write/listenが行われる
code:ts
import React, { useEffect, useRef } from "react"
import type { SerializableParam } from "recoil"
import { useRecoilSync } from "recoil-sync"
export const RecoilSharedSync: React.FC<{}> = () => {
const broadcastChannelRef = useRef<BroadcastChannel | null>(null)
useEffect(() => {
const broadcastChannel = new BroadcastChannel("recoil-sync")
broadcastChannelRef.current = broadcastChannel
return () => {
broadcastChannelRef.current = null
broadcastChannel.close()
}
}, [])
useRecoilSync({
storeKey: RECOIL_SYNC_SHARED_KEY,
write: ({ diff }) => {
broadcastChannelRef.current?.postMessage(diff)
},
listen: ({ updateItem }) => {
const broadcastChannel = broadcastChannelRef.current
if (!broadcastChannel) {
return
}
const listener = (event: MessageEvent<Map<string, unknown>>) => {
updateItem(key, value)
}
}
broadcastChannel.addEventListener("message", listener)
return () => {
broadcastChannel.removeEventListener("message", listener)
}
},
})
return null
}
electron-storeと同期するSyncEffect作ったらreadでdefaultValueにフォールバックさせる方法がわかんなくて詰まってしまった 返信が来た
返り値がDefaultValueなんだから確かにインスタンスを返すのも試すべきだった、instanceofで見てるだろうし…
return new DefaultValue()
開発中にSnapshot has already been released.というのが出て死ぬことが時々ある
というか状況によってはほぼ100%発現する
再現もできてないのに起票したらエスパーしてくださって治った雰囲気があったが、治ってなかったので頑張って再現している…